/**
 * 属性名称和变量名称相同时可以简写
 */

/*module.exports = {
  getItem: getItem,
  setItem: setItem
}
// 简写
module.exports = {getItem, setItem}

let people = {
  say: function (x, y) {
    console.log('say')
    return {x: x, y: y}
  }
}
// 简写
let people = {
  say() {
    console.log('say')
    return {x, y}
  }
}*/

// 允许将变量放进[]里
let mike = 'uname'
let student = {
  [mike]: 'Tom'
}
console.log(student.uname) // Tom
console.log(student[mike]) // Tom

let map = new Map()
map.set('route', {id: 1, pid: 0, path: '/index'})
map.set('name', 'lisa')
map.set('age', 19)
console.log(map)
/*Map(3) {
  'route' => { id: 1, pid: 0, path: '/index' },
  'name' => 'lisa',
      'age' => 19
}   */
for (let key of map.keys()) {
  console.log(key)
}
/*
route
name
age*/

for (let value of map.values()) {
  console.log(value)
}
/*
{ id: 1, pid: 0, path: '/index' }
lisa
19  */

for (let item of map.entries()) {
  console.log(item)
}
/*
    [ 'route', { id: 1, pid: 0, path: '/index' } ]
    [ 'name', 'lisa' ]
    [ 'age', 19 ]  */

// Object.is  相当于ES5的===，但是有两个不同
console.log(Object.is(NaN, NaN)) // true
console.log(Object.is(+0, -0)) // false

console.log(NaN === NaN) // false
console.log(+0 === -0)  // true

// 方法用于将源对象（ source ）的所有可枚举属性复制到目标对象（ target ）。
// 只复制源对象的自身属性（不复制继承属性），也不复制不可枚举的属性（ enumerable:false）。
let source = {
  name: 'lisa',
  sex: 'woman'
}
let target = {}
Object.assign(target, source) // 只会拷贝一层，属于浅拷贝
console.log(target) // { name: 'lisa', sex: 'woman' }

// 为对象添加属性
class Point {
  constructor(x, y) {
    Object.assign(this, {x, y})
  }
}

// 为对象添加方法
Object.assign(Point.prototype, {
  draw() {
    console.log('draw')
  }
})

// 合并多个对象

// 属性的遍历
for (const targetKey in target) {

}
Object.keys()  // 不含symbol属性
Object.getOwnPropertyNames() // 不含symbol属性
Object.getOwnPropertySymbols() // 返回symbol属性
Reflect.ownKeys() // 返回所有属性、包括symbol

// __proto__

Object.setPrototypeOf()  // 用来设置一个对象的 prototype 对象，返回参数对象本身
Object.getPrototypeOf() // 用于读取一个对象的 prototype 对象

Object.keys() // 返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历( enumerable ）属性的键名。
Object.values() // 法返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历(enumerable ）属性的键值。
Object.entries() // 返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历（ numerable ）属性的键值对数组。

// 对象扩展符 ...obj
